package model

import (
	"chat_srv/basic/config"
	chat "chat_srv/basic/proto"
	"time"
)

// 消息表
type ImMessage struct {
	Id             uint      `gorm:"column:id;type:bigint UNSIGNED;comment:消息id;primaryKey;not null;" json:"id"`                                // 消息id
	ConversationId string    `gorm:"column:conversation_id;type:varchar(60);comment:会话id;not null;" json:"conversation_id"`                     // 会话id
	FormUserId     uint      `gorm:"column:form_user_id;type:int UNSIGNED;comment:发送者id;not null;" json:"form_user_id"`                         // 发送者id
	ToTargetId     string    `gorm:"column:to_target_id;type:varchar(64);comment:接收目标ID(用户ID或群ID);not null;" json:"to_target_id"`               // 接收目标ID(用户ID或群ID)
	Content        string    `gorm:"column:content;type:varchar(255);comment:消息内容;not null;" json:"content"`                                    // 消息内容
	MessageType    uint      `gorm:"column:message_type;type:tinyint UNSIGNED;comment:消息类型:1-文本 2-图片 3-语音 4-视频;not null;" json:"message_type"`  // 消息类型:1-文本 2-图片 3-语音 4-视频
	Status         uint      `gorm:"column:status;type:tinyint UNSIGNED;comment:消息状态:1-发送中 2-发送成功 3-发送失败 4-已送达 5-已读'';not null;" json:"status"` // 消息状态:1-发送中 2-发送成功 3-发送失败 4-已送达 5-已读''
	Seq            uint      `gorm:"column:seq;type:bigint UNSIGNED;comment:消息序列号;not null;" json:"seq"`                                        // 消息序列号
	SendTime       time.Time `gorm:"column:send_time;type:datetime(3);comment:发送时间;default:CURRENT_TIMESTAMP(3);" json:"send_time"`             // 发送时间
	CreatedAt      time.Time `gorm:"column:created_at;type:datetime(3);default:CURRENT_TIMESTAMP(3);" json:"created_at"`
}

// 设置与数据库映射
func (im *ImMessage) TableName() string {
	return "im_message"
}

// 保存消息
func (im *ImMessage) Create() error {
	return config.DB.Create(&im).Error
}

// 查询会话消息
func (im *ImMessage) GetConversationMessages(where *ImMessage) (imMessages []*ImMessage, err error) {
	err = config.DB.Where(where).Find(&imMessages).Error
	return imMessages, err
}

// 查询群聊消息
func (im *ImMessage) GetGroupMessages(where *ImMessage) (groupMessage []*chat.GroupMessage, err error) {
	err = config.DB.
		Table("im_message").
		Select("im_message.*,im_group_member.role,im_group_member.member_nickname").
		Joins("left join im_group_member on im_message.to_target_id = im_group_member.group_id" +
			" and im_group_member.user_id = im_message.form_user_id").
		Where(where).
		Find(&groupMessage).Error
	return groupMessage, err
}
